





import bpy
import numpy as np

import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类
import Core.bl_维度转换 as 维度转换
import Core.bl_矩阵变换 as 矩阵转换

from 对象操作 import bl_对象变换帧

from itertools import chain


import pdb


class C_Node_物体属性插帧3f(基类.C_SN_基类):
	bl_dname = 'bl_node_物体属性插帧'
	bl_label = '物体属性插帧'
	
	#m_变换方式 = bpy.props.EnumProperty(items=E_类型枚举_变换, default='TYPE_位置', name="变换方式", update=f_update_变换方式_物体属性set变换)
	#m_轴向 = bpy.props.EnumProperty(items=E_类型枚举_轴向, default='TYPE_X_Y_Z', name="轴向", update=f_update_轴向_物体属性set变换)
	def init(self, context):
		super(C_Node_物体属性插帧3f, self).f_init(context)
		self.inputs.new('C_NodeSocket_物体', name='对象')
		self.inputs.new('C_Socket1D_Vec3', name='移动')
		self.inputs.new('C_Socket1D_Vec3', name='旋转')
		self.inputs.new('C_Socket1D_Vec3', name='缩放')
		
		self.inputs.new('C_插座_List_f', name='帧')

		
	def draw_buttons(self, context, layout):
		pass
	def update(self):
		pass

	def f_update(self, 是否向下传递=False, input插座=None):
		#pdb.set_trace()
		objs = self.inputs['对象'].f_getData()
		#print('obj.scale = ', objs)
		对象数量 = 0
		if objs == None : return
		try:
			objs = list(chain(*objs))
		except :
			pass
		对象数量 = len(objs)
		
		是否设置移动 = self.inputs['移动'].is_linked
		是否设置旋转 = self.inputs['旋转'].is_linked
		是否设置缩放 = self.inputs['缩放'].is_linked
		#是否设置移动 = bool(len(移动))
		#是否设置旋转 = bool(len(旋转))
		#是否设置缩放 = bool(len(缩放))
		移动, 单例移动 = 基类.f_插座数据是否独立(self, '移动', 对象数量)
		旋转, 单例旋转 = 基类.f_插座数据是否独立(self, '旋转', 对象数量)
		缩放, 单例缩放 = 基类.f_插座数据是否独立(self, '缩放', 对象数量)
		
		帧, 单例帧 = 基类.f_插座数据是否独立(self, '帧', 对象数量)
		
		#print('objs = ', 单例帧, 帧, 对象数量, 是否设置旋转)
		index = 0
		if 是否设置移动 :
			path = 'location'
			for obj in objs :
				frame = 0
				if 单例帧 :
					frame = 帧[index]
				else:
					frame = 帧

				x = 0
				y = 0
				z = 0
				if 单例移动 :
					x = 移动[index][0]
					y = 移动[index][1]
					z = 移动[index][2]
					index += 1
				else:
					x = 移动[0]
					y = 移动[1]
					z = 移动[2]

				bl_对象变换帧.f_物体数据插帧(obj, path, 'Object Transforms', frame, x, 0)
				bl_对象变换帧.f_物体数据插帧(obj, path, 'Object Transforms', frame, y, 1)
				bl_对象变换帧.f_物体数据插帧(obj, path, 'Object Transforms', frame, z, 2)


			
		index = 0
		if 是否设置旋转 :
			path = 'rotation_euler'
			for obj in objs :
				frame = 0
				if 单例帧 :
					frame = 帧[index]
				else:
					frame = 帧
				
				x = 0
				y = 0
				z = 0
				if 单例旋转 :
					x = 旋转[index][0]
					y = 旋转[index][1]
					z = 旋转[index][2]
					index += 1
					
				else:
					x = 旋转[0]
					y = 旋转[1]
					z = 旋转[2]
				#print('旋转[index] = ', frame, x, y, z)
				#pdb.set_trace()
				bl_对象变换帧.f_物体数据插帧(obj, path, 'Object Transforms', frame, x, 0)
				bl_对象变换帧.f_物体数据插帧(obj, path, 'Object Transforms', frame, y, 1)
				bl_对象变换帧.f_物体数据插帧(obj, path, 'Object Transforms', frame, z, 2)


		index = 0
		if 是否设置缩放 :
			path = 'scale'
			for obj in objs :
				frame = 0
				if 单例帧 :
					frame = 帧[index]
				else:
					frame = 帧
				
				x = 0
				y = 0
				z = 0
				if 单例缩放 :
					x = 缩放[index][0]
					y = 缩放[index][1]
					z = 缩放[index][2]
					index += 1
				else:
					x = 缩放[0]
					y = 缩放[1]
					z = 缩放[2]

				bl_对象变换帧.f_物体数据插帧(obj, path, 'Object Transforms', frame, x, 0)
				bl_对象变换帧.f_物体数据插帧(obj, path, 'Object Transforms', frame, y, 1)
				bl_对象变换帧.f_物体数据插帧(obj, path, 'Object Transforms', frame, z, 2)

		super(C_Node_物体属性插帧3f, self).f_update(是否向下传递, input插座)




class C_NODE_MENU_物体属性插帧3f(bpy.types.Operator):
	bl_idname = 'node.global_node_set_obj_attr_insert_frame'
	bl_label = '物体属性插帧3f'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_物体属性插帧3f', use_transform=True)
		return {'FINISHED'}













classes = (
	C_Node_物体属性插帧3f,
	C_NODE_MENU_物体属性插帧3f,
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)



